package TecMaster;

import java.io.Serializable;

/**
 * Classe cliente do projeto TecMaster. Responsavel por guardar as informacoes
 * do cliente.
 * 
 * @author Flavio Ramalho
 * 
 * @version 1.0
 * 
 */
public class Cliente implements Comparable<Cliente>, Serializable {
	private static final long serialVersionUID = -2486262965915197311L;
	private String nome;
	private String endereco;
	private String cpf;

	/**
	 * Construtor de Cliente.
	 * 
	 * @param nome
	 *            o nome do cliente.
	 * @param endereco
	 *            o endereco do cliente.
	 * @param cpf
	 *            o cpf do cliente.
	 * @throws Exception
	 *             caso o cpf seja invalido.
	 */
	public Cliente(String nome, String endereco, String cpf) {
		if (nome == null || nome.equals(""))
			throw new IllegalArgumentException("Nome do cliente invalido");
		if (endereco == null || endereco.equals(""))
			throw new IllegalArgumentException("Endereco do cliente invalido");
		if (cpf == null || cpf == "" || cpf.length() > 11 || cpf.length() < 11
				|| !cpf.matches("^[0-9]*$"))
			throw new IllegalArgumentException("CPF Invalido");
		this.nome = nome;
		this.endereco = endereco;
		this.cpf = formataCpf(cpf);
	}

	/**
	 * Retorna o endereco do cliente.
	 * 
	 * @return o endereco do cliente.
	 */
	public String getEndereco() {
		return endereco;
	}

	/**
	 * Modifica o endereco do cliente.
	 * 
	 * @param endereco
	 *            o novo endereco do cliente.
	 */
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	/**
	 * Retorna o nome do cliente.
	 * 
	 * @return o nome do cliente.
	 */
	public String getNome() {
		return nome;
	}

	/**
	 * Retorna o cpf do cliente.
	 * 
	 * @return o cpf do cliente.
	 */
	public String getCpf() {
		return cpf;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((cpf == null) ? 0 : cpf.hashCode());
		return result;
	}

	/**
	 * Dois clientes serao iguals quando possuirem o mesmo cpf.
	 */
	@Override
	public boolean equals(Object obj) {
		if (obj.getClass() != getClass())
			return false;
		Cliente outro = (Cliente) obj;
		return getCpf().equals(outro.getCpf());
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String toString() {
		return ("Cliente: " + getNome() + " - Endereco: " + getEndereco()
				+ " - CPF: " + getCpf());
	}

	/**
	 * Formata o cpf para o formato XXX.XXX.XXX - XX.
	 * 
	 * @param cpf
	 *            o cpf do cliente.
	 * @return o cpf formatado.
	 */
	private String formataCpf(String cpf) {
		return (cpf.substring(0, 3) + "." + cpf.substring(3, 6) + "."
				+ cpf.substring(6, 9) + "-" + cpf.substring(9, 11));
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public int compareTo(Cliente o) {
		nome.compareTo(o.getNome());
		return 0;
	}
}
